﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Proxy;
using SIM.Geo.UI.Movil.Clases.DTO;
using SIM.Geo.UI.Movil.Clases;
using System.Text;
using SIM.Util;
using System.Globalization;

namespace SIM.Geo.UI.Movil.Controllers
{
    public class EnvioMuestraController : BaseController
    {
        //private UsuarioResponse Usuario
        //{
        //    get { return (UsuarioResponse)Session[Sesiones.USUARIO]; }
        //}

        //
        // GET: /EnvioMuestra/
        List<DetalleGuiaSalidaMuestra> listaMuestras = new List<DetalleGuiaSalidaMuestra>();
        private const string SESSION_MUESTRAS = "Envio_Muestras";

        public ActionResult Index()
        {
            Session.Remove(SESSION_MUESTRAS);

           
            return View();
        }
        public string MonthName(int month)
        {
            DateTimeFormatInfo dtinfo = new CultureInfo("es-ES", false).DateTimeFormat;
            return dtinfo.GetMonthName(month);
        }
        public JsonResult Listar(string anio,string mes)
        {
                using (SEGuiaSalidaMuestraClient proxy = new SEGuiaSalidaMuestraClient())
                {
                  var datos = proxy.ListarGuiaSalidaMuestra1(anio,mes);
                  List<DTOGuiaSalidaMuestra>listaDto= new     List<DTOGuiaSalidaMuestra>();
                  datos.ToList().ForEach(x =>
                  {
                      listaDto.Add(new DTOGuiaSalidaMuestra
                      {
                          Anio = x.Anio,
                          CodigoGuiaSalida = x.CodigoGuiaSalida,
                          DescEstado = x.Estado == (short)enmEstadoGuiaSalida.Registrado ? "Registrado" : x.Estado == (short)enmEstadoGuiaSalida.Enviado ? "Enviado" : x.Estado == (short)enmEstadoGuiaSalida.Anulado ? "Anulado" : x.Estado == (short)enmEstadoGuiaSalida.EnLaboratorio ? "En Laboratorio" : x.Estado == (short)enmEstadoGuiaSalida.Muestreado ? "Muestreado" : "No definido",
                          Fecha = x.Fecha,
                          Estado=x.Estado,
                          DescMes = MonthName(Convert.ToInt32(x.Mes))
                      });
                    });
                    return Json(listaDto, JsonRequestBehavior.AllowGet);
                }
        }

        public JsonResult AddMuestra(string CodigoMuestra)
        {
            Resultado retorno = new Resultado();

            try
            {
                bool flag_exite = true;

                using (SECodigoMuestraClient proxy = new SECodigoMuestraClient())
                {
                   var existe= proxy.ObtenerCodigoMuestra(CodigoMuestra);
                   if (existe == null)
                   {
                       flag_exite = false;
                       retorno.message = "Código de Muestra no existe";
                       retorno.result = 0;
                   }
                   else
                   {
                       if (existe.CodigoEstado != 2)
                       {
                           flag_exite = false;
                           retorno.message = "Código de Muestra no Disponible";
                           retorno.result = 0;
                       }
                   }
                }
                
                if (flag_exite)
                {
                    listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                    if (listaMuestras == null) listaMuestras = new List<DetalleGuiaSalidaMuestra>();
                    foreach (var detalle in listaMuestras)
                    {
                        if (detalle.CodigoMuestra == CodigoMuestra)
                        {
                            flag_exite = false;
                            retorno.message = "Ya se agregó la muestra";
                            retorno.result = 0;
                        }
                    }
                }
                if (flag_exite)
                {
                    DetalleGuiaSalidaMuestra item = new DetalleGuiaSalidaMuestra() { CodigoMuestra = CodigoMuestra, Orden = listaMuestras.Count + 1 };
                    listaMuestras.Add(item);

                    Session[SESSION_MUESTRAS] = listaMuestras;
                    retorno.message = "";
                    retorno.result = 1;
                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:Validar", this.UserLogon.CodigoUsuario, ex);

            }
            return Json(retorno, JsonRequestBehavior.AllowGet);


        }

        public JsonResult CerrarPopUp()
        {
            Session.Remove(SESSION_MUESTRAS);
            return Json(new Resultado() { result = 1, message = "OK" }, JsonRequestBehavior.AllowGet);
        }


        public JsonResult delAddMuestra()
        {
            string Codigo = "";
            int CodigoGuiaMuestra = 0;
            if (Request.QueryString["CodigoMuestra"] != null)
            {
                Codigo = Convert.ToString(Request.QueryString["CodigoMuestra"]);
            }
            if (Request.QueryString["CodigoGuiaSalida"] != null)
            {
                CodigoGuiaMuestra = Convert.ToInt32(Request.QueryString["CodigoGuiaSalida"]);
            }

            
            Resultado retorno = new Resultado();
            try
            {

                using (SEGuiaSalidaMuestraClient proxy = new SEGuiaSalidaMuestraClient())
                {

                   var data= proxy.ObtenerGuiaSalidaMuestra(CodigoGuiaMuestra);
                   if (data != null)
                   {
                       if (data.Estado == (short)enmEstadoGuiaSalida.Registrado)
                       {
                           listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                           if (listaMuestras != null)
                           {
                               DetalleGuiaSalidaMuestra objDel = null;
                               foreach (var item in listaMuestras) { if (item.CodigoMuestra == Codigo) { objDel = item; } }
                               if (objDel != null) { listaMuestras.Remove(objDel); }
                           }
                           Session[SESSION_MUESTRAS] = listaMuestras;
                       }
                   }
                   else {
                       listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                       if (listaMuestras != null)
                       {
                           DetalleGuiaSalidaMuestra objDel = null;
                           foreach (var item in listaMuestras) { if (item.CodigoMuestra == Codigo) { objDel = item; } }
                           if (objDel != null) { listaMuestras.Remove(objDel); }
                       }
                      Session[SESSION_MUESTRAS] = listaMuestras;
                 
                   
                   }
                }
                retorno.message = "";
                retorno.result = 1;

            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:delAddMuestra", this.UserLogon.CodigoUsuario, ex);

            }
            return Json(retorno, JsonRequestBehavior.AllowGet);


        }

      [HttpPost]
        public JsonResult Enviar(int idGuiaMuestra)
        {
            Resultado retorno = new Resultado();
            try
            {
                using (SEGuiaSalidaMuestraClient proxy = new SEGuiaSalidaMuestraClient())
                {
                     var guia=proxy.ObtenerGuiaSalidaMuestra(idGuiaMuestra);
                  if (guia != null)
                  {
                      if (guia.Estado == (short)enmEstadoGuiaSalida.Muestreado)
                      {
                          retorno.message = "No se puede enviar la guía. Estado actual Muestreado.";
                          retorno.result = 0;
                          retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                      }
                      else if (guia.Estado == (short)enmEstadoGuiaSalida.Anulado)
                      {
                          retorno.message = "No se puede enviar la guía. Estado actual Anulado.";
                          retorno.result = 0;
                          retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                      }
                      else
                      {
                          proxy.EnviarGuiaSalidaMuestra(idGuiaMuestra);

                          /*ENVIO DE CORREO*/
                              string asunto = System.Web.Configuration.WebConfigurationManager.AppSettings["strAsunto"];
                              string strMensaje = System.Web.Configuration.WebConfigurationManager.AppSettings["strMensaje"];
                              var datos = proxy.ObtenerGuiaSalidaMuestra(idGuiaMuestra);
                              string msg = "";
                              msg = msg + String.Format("Estimados Sres:<br/><br/>{0}<br/>", strMensaje); ;
                              msg = msg + "<br/>";
                              msg = msg + "<table border=1 style='width:70%;border-collapse:collapse; '>";
                              msg = msg + "<tr style='background:#ccc;'>";
                              msg = msg + "<td><b>CodigoGuiaSalida</b></td>";
                              msg = msg + "<td><b>Fecha</b></td>";
                              msg = msg + "<td><b>Año</b></td>";
                              msg = msg + "<td><b>Mes</b></td>";
                              msg = msg + "</tr>";

                              msg = msg + "<tr>";
                              msg = String.Format("{0}<td>{1}</td>", msg, datos.CodigoGuiaSalida);
                              msg = String.Format("{0}<td>{1}</td>", msg, datos.Fecha);
                              msg = String.Format("{0}<td>{1}</td>", msg, datos.Anio);
                              msg = String.Format("{0}<td>{1}</td>", msg, datos.Mes);
                              msg = msg + "</tr>";


                              msg = msg + "<tr  style='background:#ccc;'>";
                              msg = msg + "<td colspan=4><b>Lista de Muestras:<b></td>";
                              msg = msg + "</tr>";
                              foreach (var item in datos.DetalleGuiaSalidaMuestra)
                              {
                                  msg = msg + "<tr>";
                                  msg = String.Format("{0}<td colspan=4>{1}</td>", msg, item.CodigoMuestra);
                                  msg = msg + "</tr>";

                              }
                              msg = msg + "</table>";
                              msg = msg + "<br/><br/>Atte.<br/>Sistema Informacion Minero - SIM<br/>";

                              try
                              {
                                  Generales.Notificar(asunto, msg);
                              }
                              catch 
                              {
                                  retorno.result = 0;
                                  retorno.code = Constantes.CodigoAplicacion.COD_ERROR_ENVIAR_CORREO;
                                  retorno.message = Constantes.MensajeGenerico.MSG_ERROR_CORREO;
                                  ///registrar al log de errores aqui
                              }


                          retorno.message = "";
                          retorno.result = 1;

                      }
                  }
                  else
                  {
                      retorno.message = "No se pudo obtener el estado de la guia";
                      retorno.result = 0;
                      retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                  }
                }

              
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:Enviar", this.UserLogon.CodigoUsuario, ex);

            }
            return Json(retorno, JsonRequestBehavior.AllowGet);


        }
      [HttpPost]
      public JsonResult Anular(int idGuiaMuestra)
      {


          Resultado retorno = new Resultado();
          try
          {
              using (SEGuiaSalidaMuestraClient proxy = new SEGuiaSalidaMuestraClient())
              {
                  var guia=proxy.ObtenerGuiaSalidaMuestra(idGuiaMuestra);
                  if (guia != null)
                  {
                      if (guia.Estado == (short)enmEstadoGuiaSalida.EnLaboratorio)
                      {
                          retorno.message = "No se puede anular la guia. Estado actual Recibida en Laboratorio.";
                          retorno.result = 0;
                          retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                      }else if (guia.Estado == (short)enmEstadoGuiaSalida.Anulado)
                      {
                          retorno.message = "No se puede anular la guia. Estado actual Anulado.";
                          retorno.result = 0;
                          retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                      }
                      else
                      {
                          proxy.AnularGuiaSalidaMuestra(idGuiaMuestra);
                          retorno.message = "";
                          retorno.result = 1;
                      }
                  }
                  else {

                      retorno.message = "No se pudo obtener el estado de la guia";
                      retorno.result = 0;
                      retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                  }

                  
              }

          

          }
          catch (Exception ex)
          {
              retorno.result = 0;
              retorno.message = ex.Message;
              Logger.Error("Envio Muestra Controller:Anular", this.UserLogon.CodigoUsuario, ex);
          }
          return Json(retorno, JsonRequestBehavior.AllowGet);


      }
        public JsonResult ListarMuestra()
        {
            listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
            return Json(listaMuestras, JsonRequestBehavior.AllowGet);
        }


        //POST: //Estructura /Create
        /// <summary>
        /// metodo para guardar registro estructura
        /// </summary>
        /// <param name="entidad"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult Create(GuiaSalidaMuestra entidad)
        {
            Resultado retorno = new Resultado();
            try
            {
                bool flag_exito = true;
                //if (entidad.Desde >= entidad.Hasta)
                //{
                //    retorno.code = 999;
                //    retorno.result = 0;
                //    retorno.message = Constantes.MensajeEstructura.MSG_VALIDA_RANGO;
                //    flag_exito = false;
                //}
                if (flag_exito)
                {
                    var guia = entidad;
                    using (var proxy = new SEGuiaSalidaMuestraClient())
                    {
                        guia.CodigoGeologo = UserLogon.CodigoGeologo; //Usuario.CodigoGeologo;
                        guia.Fecha = DateTime.Now;
                        guia.Estado = (short)enmEstadoGuiaSalida.Registrado;

                        listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                        if (listaMuestras != null && listaMuestras.Count > 0)
                        {
                            List<DetalleGuiaSalidaMuestra> listDetalleGuia = new List<DetalleGuiaSalidaMuestra>();
                            int idx=0;
                            foreach (DetalleGuiaSalidaMuestra item in listaMuestras)
                            {
                                idx=idx+1;
                                listDetalleGuia.Add(new DetalleGuiaSalidaMuestra
                                {

                                    CodigoGuiaSalida = item.CodigoGuiaSalida,
                                    CodigoMuestra = item.CodigoMuestra,
                                    FechaRegistro = guia.Fecha,
                                      Orden=idx

                                });
                                //    Fecha =  guia.Fecha
                            }
                            guia.DetalleGuiaSalidaMuestra = listDetalleGuia.ToArray();
                        }

                        var obj = proxy.InsertarGuiaSalidaMuestra(guia);
                        retorno.result = 1;
                        retorno.message = Constantes.MensajeEstructura.MSG_INSERT_OK;
                    }
                }

                //fin de validaciones insert

            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = String.Format("Ocurrió un Error: {0}", ex.Message);
                Logger.Error("Envio Muestra Controller:Create", this.UserLogon.CodigoUsuario, ex);

            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }



        //POST
        /// <summary>
        /// metodo modificar el registro de guia de salida
        /// </summary>
        /// <param name="entidad"></param>
        /// <returns></returns>
        [HttpPost]
        public JsonResult Modificar(GuiaSalidaMuestra entidad)
        {
            Resultado retorno = new Resultado();
            try
            {
                bool flag_exito = true;
                //if (entidad.Desde >= entidad.Hasta)
                //{
                //    retorno.code = 999;
                //    retorno.result = 0;
                //    retorno.message = Constantes.MensajeEstructura.MSG_VALIDA_RANGO;
                //}
                using (var proxy = new SEGuiaSalidaMuestraClient())
                {
                    var oguia = proxy.ObtenerGuiaSalidaMuestra(entidad.CodigoGuiaSalida);
                    if (oguia != null)
                    {
                        if (oguia.Estado != (short)enmEstadoGuiaSalida.Registrado)
                        {
                            retorno.code = Constantes.CodigoAplicacion.COD_ERROR_PERSONALIZADO;
                            retorno.result = 0;
                            retorno.message ="Sólo se puede actualizar una guia con estado registrado.";
                            flag_exito = false;
                        }
                    }
                }
                //fin de validaciones insert
                if (flag_exito)
                {
                    var guia = entidad;
                    using (var proxy = new SEGuiaSalidaMuestraClient())
                    {
                        guia.CodigoGeologo = UserLogon.CodigoGeologo;// Usuario.CodigoGeologo;
                        guia.Fecha = DateTime.Now;
                        guia.Estado = (short)enmEstadoGuiaSalida.Registrado;

                        ///SETTING LISTA MUESTRAS
                        listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                        if (listaMuestras != null && listaMuestras.Count > 0)
                        {

                            List<DetalleGuiaSalidaMuestra> listaMuestrasUpd = new List<DetalleGuiaSalidaMuestra>();
                            foreach (DetalleGuiaSalidaMuestra item in listaMuestras)
                            {
                                listaMuestrasUpd.Add(new DetalleGuiaSalidaMuestra
                                {
                                    CodigoGuiaSalida = guia.CodigoGuiaSalida,
                                    CodigoMuestra = item.CodigoMuestra,
                                    FechaRegistro = guia.Fecha,
                                    Orden=item.Orden
                                });
                                
                            }

                            guia.DetalleGuiaSalidaMuestra = listaMuestrasUpd.ToArray();
                        }

                        proxy.ModificarGuiaSalidaMuestra(guia);
                        retorno.result = 1;
                        retorno.message = Constantes.MensajeEstructura.MSG_EDIT_OK;
                    }
                }


            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:Modificar", this.UserLogon.CodigoUsuario, ex);
            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }
        //GET: /EnviaMuestra/Edit/5
        /// <summary>
        /// metodo obtener el registro de Guia de Salida
        /// </summary>
        /// <param name="idGuiaSalida"></param>
        /// <returns></returns>
        public JsonResult Edit(int idGuiaSalida)
        {
            Resultado retorno = new Resultado();
           
            try
            {
          
                using (var proxy = new SEGuiaSalidaMuestraClient())
                {
                    var obj = proxy.ObtenerGuiaSalidaMuestra(idGuiaSalida);
                    if (obj != null )
                    {
                        using (var proxygeo = new SEGeologoClient())
                        {
                            obj.Geologo = proxygeo.ObtenerGeologo(obj.CodigoGeologo);
                        }
                    }
                 
                    if (obj != null && obj.DetalleGuiaSalidaMuestra != null)
                    {

                        List<DetalleGuiaSalidaMuestra> listTipoDetaGuias = new List<DetalleGuiaSalidaMuestra>();
                        foreach (DetalleGuiaSalidaMuestra item in obj.DetalleGuiaSalidaMuestra)
                        {
                            listTipoDetaGuias.Add(new DetalleGuiaSalidaMuestra
                            {
                                CodigoGuiaSalida = item.CodigoGuiaSalida,
                                CodigoMuestra = item.CodigoMuestra,
                                FechaRegistro=item.FechaRegistro,
                                Orden=item.Orden
                            });
                        }//   Fecha = item.Fecha       
                        Session[SESSION_MUESTRAS] = listTipoDetaGuias;
                    }

                    retorno.result = 1;
                    retorno.message = "OK";
                    retorno.data = Json(obj, JsonRequestBehavior.AllowGet);

                }
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:Editar", this.UserLogon.CodigoUsuario, ex);

            }

            return Json(retorno, JsonRequestBehavior.AllowGet);
        }


        /// <summary>
        /// ACTION PARA REEMPLAZAR A L GRILLA POR TEMA DE COMPATIBILIDAD - DBS 20140715
        /// </summary>
        /// <returns></returns>
        
        [HttpPost]
        public JsonResult ListarMuestraHtml()
        {
            Resultado retorno = new Resultado();
            StringBuilder sb = new StringBuilder();
            try
            {
                listaMuestras = (List<DetalleGuiaSalidaMuestra>)Session[SESSION_MUESTRAS];
                sb.Append("<div class='k-grid-content' style='height: 118px;'>");
                sb.Append("<table class='k-grid k-widget' style='width: 100%;' >");
                sb.Append("<tr class='k-grid-header'><th class='k-header'>Codigo</th><th class='k-header'>&nbsp;</th></tr>");
                if (listaMuestras != null)
                {
                    int i = 0;
                    string alt = "";
                    foreach (var item in listaMuestras)
                    {
                        if (i % 2 == 0)
                            alt = " class='k-alt' ";
                        else
                            alt = "";
                        sb.AppendFormat("<tr {0} ><td>{1}</td>", alt, item.CodigoMuestra);
                        string idGrilla = item.CodigoGuiaSalida == 0 ? "#gridMuestra" : "#gridMuestraEdit";
                        sb.AppendFormat("<td><a class='k-button k-button-icontext k-grid-delete' href=javascript:delAddMuestraHtml('{0}','{1}','{2}'); > <span class='k-icon k-delete'></span>Delete</a></td></tr>", item.CodigoMuestra, item.CodigoGuiaSalida, idGrilla);
                        i++;
                    }

                }
                sb.Append("</table>");
                sb.Append("</div>");
                retorno.result = 1;
                retorno.message = sb.ToString();
            }
            catch (Exception ex)
            {
                retorno.result = 0;
                retorno.message = ex.Message;
                Logger.Error("Envio Muestra Controller:ListarMuestraHtml", this.UserLogon.CodigoUsuario, ex);

            }
            return Json(retorno, JsonRequestBehavior.AllowGet);
        }


    }

     
    
}
